/*
主函数包，运行开始位置

2025/10/05
创建一个包含网关和多个节点服务的完整演示
*/
package main

import (
	"gameServer/cluster/gate"
	"gameServer/cluster/node"
	. "gameServer/container"
	"gameServer/log"
	"gameServer/registry"
	"gameServer/registry/memory"
)

/* //* 游戏服务器主入口文件，创建并启动网关和多个节点服务，配置共享注册中心，实现完整的分布式游戏服务器集群 */

func main() {
	// 创建共享的注册中心实例（必须统一用这一个，否则每个插件都是独立的注册中心）
	registry := memory.NewMemoryRegistry()
	//  创建容器
	container := NewContainer()
	// 创建网关组件（目前使用共享的注册中心实例）
	gateComponent := gate.NewGate().SetRegistry(registry).SetTcpServer(":52051")

	// 添加网关组件
	container.Add(gateComponent)
	// 创建多个节点组件，配置共享注册中心（默认）
	gameNode := node.NewNode("game", "rune_work.com", 52052).SetRegistry(registry)
	chatNode := node.NewNode("chat", "rune_work.com", 52053).SetRegistry(registry)
	matchNode := node.NewNode("match", "rune_work.com", 52054).SetRegistry(registry)
	// 添加组件到容器中
	container.Add(gameNode)
	container.Add(chatNode)
	container.Add(matchNode)
	log.Info("Starting game server...")
	log.Info("TCP server will listen on port 52051")
	log.Info("Node services:")
	log.Info("  - Game node: localhost:52052")
	log.Info("  - Chat node: localhost:52053")
	log.Info("  - Match node: localhost:52054")
	log.Info("Press Ctrl+C to stop the server")

	// 启动网关组件
	// go container.Server()  // 查看服务信息 非阻塞
	container.Server() // 不查看，阻塞

	defer log.Info("Game server stopped")

	// // 等待一段时间让所有服务注册完成
	// time.Sleep(2 * time.Second)

	// // 查询并显示所有注册的服务
	// displayRegisteredServices(registry)
	// // 等待终止信号
	// sigChan := make(chan os.Signal, 1)
	// signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
	// <-sigChan

	defer log.Info("Shutting down server cluster...")
}

// 显示所有注册的服务
func displayRegisteredServices(registry registry.Registry) {
	// 列出所有服务
	services, err := registry.ListServices()
	if err != nil {
		log.Errorf("Failed to list services: %v", err)
		return
	}
	log.Infof("=== Registered Services (%d) ===", len(services))
	for _, service := range services {
		log.Infof("Service: %s (ID: %s)", service.Name, service.ID)
		log.Infof("  Address: %s:%d", service.Address, service.Port)
		log.Infof("  Metadata: %v", service.Metadata)
		log.Info("---")
	}
}
